﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace Gestion
{
    public partial class ClientesBusq : Form
    {
        // Controla si la última fila seleccionada se considera activa
        // para operaciones de Modificación o Baja.
        private Boolean bFilaActiva;


        public ClientesBusq()
        {
            InitializeComponent();
        }

        private void frmClientesBusq_Load(object sender, EventArgs e)
        {
            // Establecer la cadena de conexión a la BD de la aplicación
            clsComun.setCadenaConexionBD();

            // Cargar Combo Provincias
            clsComunGestion.CargaComboProvincias(ref cboProvincia, true);

            // Por defecto, se marcará la línea vacia.
            cboProvincia.SelectedValue = 0;

            // Inicializar la búsqueda por Fecha Nacimiento
            // Inicialmente no está activada. Se deshabilitan ambas fechas
            chkFechaNac.Checked = false;
            lblFechaNacDesde.Enabled = false;
            lblFechaNacHasta.Enabled = false;
            txtFechaNacDesde.Enabled = false;
            txtFechaNacHasta.Enabled = false;
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            // Conexión con la base de datos
            MySqlConnection miConexion;
            MySqlDataReader miReader;

            // Consulta SQL a ejecutar
            MySqlCommand miComando;
            String strSQL;

            // Linea para gestionar la lista
            ListViewItem lineaLista;

            // Crear la conexión con la base de datos 
            miConexion = new MySqlConnection();

            try
            {
                // Asignar la cadena de conexión a la base de datos
                miConexion.ConnectionString = clsComun.getCadenaConexionBD();

                // Abrir la conexión
                miConexion.Open();
                
                // Preparar la cadena con la sentencia SQL a ejecutar
                strSQL = "select cod_cli, nombre, apellidos, tlf_fijo " +
                         "from clientes where 1=1";

                if (txtCodigo.Text != "")
                    strSQL = strSQL + " and cod_cli = " + txtCodigo.Text;

                if (txtDNI.Text != "")
                    strSQL = strSQL + " and dni = '" + txtDNI.Text + "'";

                if (txtNombre.Text != "")
                    strSQL = strSQL + " and nombre like '%" + txtNombre.Text + "%'";

                if (txtApellidos.Text != "")
                    strSQL = strSQL + " and apellidos like '%"+txtApellidos.Text+"%'";

                // Si no se ha seleccionado la provincia con código 0 (provincia vacía)
                if (cboProvincia.SelectedValue.ToString() != "0")
                    strSQL = strSQL + " and cod_prov = " + 
                                      cboProvincia.SelectedValue.ToString();

                if (chkFechaNac.Checked)
                {
                    strSQL = strSQL + " and fecha_nac >= '" +
                                      clsComun.FechaSQL(txtFechaNacDesde.Value) + "'";

                    strSQL = strSQL + " and fecha_nac <= '" +
                                      clsComun.FechaSQL(txtFechaNacHasta.Value) + "'";
                }

                strSQL = strSQL + " order by apellidos, nombre, cod_cli";

                // Preparar el comando con la consulta a ejecutar
                miComando = new MySqlCommand(strSQL, miConexion);

                // Ejecutar la consulta y almacenar el resultado en el objeto Reader
                miReader = miComando.ExecuteReader();

                // Inicializar el control ListView
                lstClientes.Items.Clear();

                // Si la consulta no ha devuelto ningún registro
                if (miReader.HasRows == false)
                {
                    MessageBox.Show("No existe ningún Cliente con estos criterios.",
                                    "Aviso",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);
                }

                // Procesamos los resultados, si no hay registros, no procesa nada
                while (miReader.Read())
                {
                    lineaLista = new ListViewItem();

                    lineaLista.Text = miReader.GetString("cod_cli");
                    lineaLista.SubItems.Add(miReader.GetString("apellidos"));
                    lineaLista.SubItems.Add(miReader.GetString("nombre"));

                    // Si la columna tlf_fijo continue null, se cargará vacía
                    if (miReader.IsDBNull(miReader.GetOrdinal("tlf_fijo")))
                        lineaLista.SubItems.Add("");
                    else
                        lineaLista.SubItems.Add(miReader.GetString("tlf_fijo"));

                    lstClientes.Items.Add(lineaLista);
                }

                // Cierro el objeto Reader
                miReader.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message,
                                "Error",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
            finally
            {
                // Desconexión de la base de datos
                miConexion.Close();
            }
        }

        private void lstClientes_DoubleClick(object sender, EventArgs e)
        {
            ClientesDet frmDetalle;  // Instancia del formulario de detalle

            // Crear instancia del formulario de detalle
            frmDetalle = new ClientesDet();

            // Asignar el modo de operación de Consulta
            frmDetalle.setModOpe(ModosOper.Consulta);

            // Indicar el código del cliente a mostrar
            frmDetalle.setCodigo(lstClientes.FocusedItem.Text);

            // Mostrar la ventana de detalle
            frmDetalle.ShowDialog();
        }

        private void btnAnadir_Click(object sender, EventArgs e)
        {
            ClientesDet frmDetalle;  // Instancia del formulario de detalle
            DialogResult resp;          // Respuesta del formulario de detalle

            // Crear instancia del formulario de detalle
            frmDetalle = new ClientesDet();

            // Asignar el modo de operación
            frmDetalle.setModOpe(ModosOper.Alta);

            // Mostrar la ventana de detalle
            resp = frmDetalle.ShowDialog();

            // Si se ha cerrado el formulario de detalle aceptando la operación,
            // y la lista estaba cargada
            if (resp == DialogResult.OK & lstClientes.Items.Count > 0)
            {
                // Ejecutar la búsqueda para refrescar la lista
                btnBuscar_Click(sender, e);
            }
        }

        private void btnModificar_Click(object sender, EventArgs e)
        {
            ClientesDet frmDetalle;  // Instancia del formulario de detalle
            DialogResult resp;          // Respuesta del formulario de detalle

            // Si no se ha seleccionado ninguna línea de la lista,
            // o no se considera activa (el foco no viene de la lista)
            if (lstClientes.SelectedItems.Count == 0 | bFilaActiva == false)
            {
                // Mostrar mensaje de aviso. No se accederá al al Detalle
                MessageBox.Show("Debe seleccionar un Cliente.",
                                "Aviso",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
            }
            else
            {
                // Hay una línea seleccionada, se accederá al Detalle

                // Crear instancia del formulario de detalle
                frmDetalle = new ClientesDet();

                // Asignar el modo de operación de Modificación
                frmDetalle.setModOpe(ModosOper.Modificacion);

                // Indicar el código del cliente a mostrar
                frmDetalle.setCodigo(lstClientes.FocusedItem.Text);

                // Mostrar la ventana de detalle
                resp = frmDetalle.ShowDialog();

                // Si se ha cerrado el formulario de detalle aceptando la operación
                if (resp == DialogResult.OK)
                {
                    // Ejecutar la búsqueda para refrescar la lista
                    btnBuscar_Click(sender, e);
                }
                else
                {
                    // Volver a marcar la línea que estaba seleccionada de la lista
                    lstClientes.Focus();
                    lstClientes.Items[lstClientes.FocusedItem.Index].Selected = true;
                }
            }
        }

        private void btnBorrar_Click(object sender, EventArgs e)
        {
            ClientesDet frmDetalle;  // Instancia del formulario de detalle
            DialogResult resp;          // Respuesta del formulario de detalle

            // Si no se ha seleccionado ninguna línea de la lista,
            // o no se considera activa (el foco no viene de la lista)
            if (lstClientes.SelectedItems.Count == 0 | bFilaActiva == false)
            {
                // Mostrar mensaje de aviso. No se accederá al al Detalle
                MessageBox.Show("Debe seleccionar un Cliente.",
                                "Aviso",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
            }
            else
            {
                // Hay una línea seleccionada, se accederá al Detalle

                // Crear instancia del formulario de detalle
                frmDetalle = new ClientesDet();

                // Asignar el modo de operación de Baja
                frmDetalle.setModOpe(ModosOper.Baja);

                // Indicar el código del cliente a mostrar
                frmDetalle.setCodigo(lstClientes.FocusedItem.Text);

                // Mostrar la ventana de detalle
                resp = frmDetalle.ShowDialog();

                // Si se ha cerrado el formulario de detalle aceptando la operación
                if (resp == DialogResult.OK)
                {
                    // Ejecutar la búsqueda para refrescar la lista
                    btnBuscar_Click(sender, e);
                }
                else
                {
                    // Volver a marcar la línea que estaba seleccionada de la lista
                    lstClientes.Focus();
                    lstClientes.Items[lstClientes.FocusedItem.Index].Selected = true;
                }
            }
        }

        private void txtCodigo_KeyPress(object sender, KeyPressEventArgs e)
        {
            // Comprobar que la tecla pulsada es válida para un campo que solo contiene Números
            clsComun.TeclaNumero(sender, e);
        }

        private void txtDNI_KeyPress(object sender, KeyPressEventArgs e)
        {
            // Comprobar que la tecla pulsada es válida para un campo que solo contiene Letras y Números
            clsComun.TeclaLetraNumero(sender, e);
        }

        private void lstClientes_Leave(object sender, EventArgs e)
        {
            // Cuando la lista pierde el foco, la línea seleccionada vuelve a
            // su aspecto normal, pero internamente la fila sigue seleccionada.

            // Si el foco va directamente al botón Modificar o Borrar,
            // se permitirá la operación (la fila seleccionada sigue estando activa).
            if (btnModificar.Focused | btnBorrar.Focused)
            {
                // La fila se considera activa (permitir Modificación o Baja)
                bFilaActiva = true;
            }
            else
            {
                // La fila NO se considera activa (impedir Modificación o Baja)
                bFilaActiva = false;
            }
        }

        private void chkFechaNac_CheckedChanged(object sender, EventArgs e)
        {
            // Si la check está marcada
            if (chkFechaNac.Checked == true)
            {
                // Habilitar los campos de Fecha Nacimiento
                lblFechaNacDesde.Enabled = true;
                lblFechaNacHasta.Enabled = true;
                txtFechaNacDesde.Enabled = true;
                txtFechaNacHasta.Enabled = true;
            }
            else
            {
                // La check no está marcada

                // Deshabilitar los campos de Fecha Nacimiento
                lblFechaNacDesde.Enabled = false;
                lblFechaNacHasta.Enabled = false;
                txtFechaNacDesde.Enabled = false;
                txtFechaNacHasta.Enabled = false;
            }

            // Ha cambiado este campo del filtro
            // Se limpia la lista
            lstClientes.Items.Clear();
        }

        private void txtCodigo_TextChanged(object sender, EventArgs e)
        {
            // Ha cambiado este campo del filtro

            // Se limpia la lista
            lstClientes.Items.Clear();
        }

        private void txtDNI_TextChanged(object sender, EventArgs e)
        {
            // Ha cambiado este campo del filtro

            // Se limpia la lista
            lstClientes.Items.Clear();
        }

        private void txtApellidos_TextChanged(object sender, EventArgs e)
        {
            // Ha cambiado este campo del filtro

            // Se limpia la lista
            lstClientes.Items.Clear();
        }

        private void txtNombre_TextChanged(object sender, EventArgs e)
        {
            // Ha cambiado este campo del filtro

            // Se limpia la lista
            lstClientes.Items.Clear();
        }

        private void txtFechaNacDesde_ValueChanged(object sender, EventArgs e)
        {
            // Ha cambiado este campo del filtro

            // Se limpia la lista
            lstClientes.Items.Clear();
        }

        private void txtFechaNacHasta_ValueChanged(object sender, EventArgs e)
        {
            // Ha cambiado este campo del filtro

            // Se limpia la lista
            lstClientes.Items.Clear();
        }

    }
}
